# 406. 根据身高重建队列
# 假设有打乱顺序的一群人站成一个队列，数组 people 表示队列中一些人的属性（不一定按顺序）。每个 people[i] = [hi, ki] 表示第 i 个人的身高
# 为 hi ，前面 正好 有 ki 个身高大于或等于 hi 的人。
# 请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ，其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性
# （queue[0] 是排在队列前面的人）。
#
# 示例 1：
# 输入：people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
# 输出：[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
# 解释：
# 编号为 0 的人身高为 5 ，没有身高更高或者相同的人排在他前面。
# 编号为 1 的人身高为 7 ，没有身高更高或者相同的人排在他前面。
# 编号为 2 的人身高为 5 ，有 2 个身高更高或者相同的人排在他前面，即编号为 0 和 1 的人。
# 编号为 3 的人身高为 6 ，有 1 个身高更高或者相同的人排在他前面，即编号为 1 的人。
# 编号为 4 的人身高为 4 ，有 4 个身高更高或者相同的人排在他前面，即编号为 0、1、2、3 的人。
# 编号为 5 的人身高为 7 ，有 1 个身高更高或者相同的人排在他前面，即编号为 1 的人。
# 因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。

# 示例 2：
# 输入：people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
# 输出：[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]


class Solution:
    def reconstructQueue(self, people):
        # 卡哥的题解没拎明白,看了下Michelle的视频,思路通了,试试
        res = []
        size = len(people)
        # 这里感觉python有点讨巧,这个sort,直接前一个元素降序排列,后一个元素升序排列
        people.sort(key=lambda x:[x[0],-x[1]],reverse=True)
        for p in range(size):
            k = people[p][1]
            # 身高排序之后，优先按身高高的people的k来插入，后序插入节点也不会影响前面已经插入的节点
            res.insert(k,people[p])
        return res

# 后续插入的数组因为身高会逐渐变矮,不影响之前插入数据的排序
# 插入的过程：
# 插入[7,0]：[[7,0]]
# 插入[7,1]：[[7,0],[7,1]]
# 插入[6,1]：[[7,0],[6,1],[7,1]]
# 插入[5,0]：[[5,0],[7,0],[6,1],[7,1]]
# 插入[5,2]：[[5,0],[7,0],[5,2],[6,1],[7,1]]
# 插入[4,4]：[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

if __name__ == '__main__':
    people = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]]
    # people.sort(key=lambda x:[x[0],-x[1]],reverse=True)
    # print(people)
    tmp = Solution()
    res = tmp.reconstructQueue(people)
    print(res)